[Amazon Connect] ノーコードで「モーニングコール」の仕組みをサクッと作ってみた

[Amazon Connect] ノーコードで「モーニングコール」の仕組みをサクッと作ってみた

流行りの「EventBridge Scheduler」に乗っかるスタイル
Clock Icon2022.11.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

みなさん、こんにちは!
福岡オフィスの青柳です。

Amazon Connectを利用する際、AWS Lambdaと連係することにより、Amazon Connectの基本機能だけでは実現できない様々な処理を行うことができます。

逆に言いますと「Amazon Connectを使いこなそうと思ったら、Lambdaとの連係は必須」と言うことができるかもしれません。

しかし今回は、敢えてLambda関数を使わず「ノーコーディング」でAmazon Connectを使った「モーニングコール」が実現できないか、チャレンジしてみました。

Amazon EventBridge Schedulerを使ってみる

Amazon EventBridge Schedulerは、先日発表されたEventBridgeの新機能 (あるいは新サービス) であり、スケジュール実行に特化した機能を提供してくれるものです。

「プログラムコードを書くことなく、AWSの様々なサービスとの連係が行える」ということで、現在クラスメソッド社内 (の一部) で「プチ・ブーム」が巻き起こっているという噂です。

(発表から数日にして、いろいろな「やってみた」記事が続々と・・・)

今回は、ブームに便乗して、この「EventBridge Scheduler」を使ってみようと思います。

仕組みを考える

「モーニングコール」≒「Amazon Connectによる自動電話発信」

「モーニングコール」とオシャレ (?) に言いましたが、要は「Amazon Connectを使って、決められた時刻に電話を自動発信する」処理を行うということです。

Amazon Connectと言うと「利用者 (お客さま) から掛かってきた電話を受け付けるもの」という印象が強いと思いますが、逆に「利用者に対して電話を発信する」ことも可能です。

オペレーターが利用者に対して電話を発信する時は、Amazon Connectのコンソール画面 (CCP) を使って電話を掛けます。

一方、オペレーターが介在せず「自動で」電話を発信する場合は、Amazon Connectに用意されている「API」(REST API) あるいは「AWS SDK」を使ってプログラム開発を行います。

AWS上でAWS SDKを使ったプログラムを実行させるには、EC2、Lambda、ECSなどのコンピューティングサービスを使うのが一般的です。

しかし、単にAWSサービスのAPIを呼び出す程度の処理であれば、EventBridge Schedulerを使うことによってプログラムコードを書かずに実現することができるのです。

やってみる

Amazon Connectの設定

それでは、設定を行っていきます。

最初に、Amazon Connectに関して以下の3つの設定を行っていきます。

  • Amazon Connectインスタンスを作成する (※今回は作成済みのインスタンスを使用したため説明は割愛)
  • 発信元として通知する「電話番号」を用意する
  • コンタクトフローを作成する

まず、電話番号を用意します。

Amazon Connectコンソール画面でメニューの「チャネル」→「電話番号」を選択して、「電話番号の取得」を選択します。

候補の中から任意の電話番号を選択してください。
発信専用の電話番号の場合、問い合わせフローに対して電話番号を紐付ける必要はありません。

次に、コンタクトフローを作成します。

「エントリ」に続いて、以下のブロックを順に配置していきます:

  • 「音声の設定」
    • 任意の音声を指定します (今回は「Mizuki」さんにしました)
  • 「プロンプトの再生」
    • テキスト読み上げで、喋らせたいテキストを入力します
  • 「切断」

「プロンプトの再生」ブロックの設定は、例えば以下のようになります。

コンタクトフローを作成しましたら、保存した後、公開します。

最後に、作成したコンタクトフローの「ARN」を確認しましょう。
画面右下の「追加のフロー情報を表示」をクリックして展開すると、コンタクトフローのARNの表示・クリップボードへのコピーが行えます。

EventBridge Schedulerの設定を行う際、ARNの情報が必要になりますので、書き留めておいてください。

IAMポリシー・IAMロールの作成

EventBridge SchedulerがAmazon ConnectのAPIを呼び出す際に、Amazon Connectに対してアクセスを行うための権限が必要となります。

EventBridge Schedulerに権限を与えるためのIAMポリシー・IAMロールを作成しましょう。

まずは、IAMポリシーを作成します。

電話を発信するために許可が必要となるのは、Amazon ConnectサービスのStartOutboundVoiceContactアクションのみです。 ポリシードキュメントを以下のように記述します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "connect:StartOutboundVoiceContact",
            "Resource": "*"
        }
    ]
}

続いて、IAMロールを作成します。

マネジメントコンソールで作成する場合、信頼するエンティティの指定画面で「AWSのサービス」を選択しても「ユースケース」にEventBridge Schedulerが現れないようです。
ですので、「カスタム信頼ポリシー」を選択して、信頼ポリシーをポリシードキュメントで記述するようにします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "scheduler.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

許可ポリシーは、先に作成したIAMポリシーを指定します。

EventBridge Schedulerのスケジュールを作成

それでは、いよいよEventBridge Schedulerの設定を行っていきます。

マネジメントコンソールより「EventBridge」の画面を開いて、左側のメニューから「スケジュール」を選択します。

「スケジュールを作成」をクリックします。

ウィザード形式でスケジュールの情報を入力していきます。

「スケジュール名」に適当な名前を入力します。
「スケジュールグループ」はデフォルト (default) のままで構いません。

続いて、スケジュールの設定を行います。

「頻度」は「定期的なスケジュール」を選択します。
「スケジュールの種類」は「cronベースのスケジュール」を選択します。

「cron式」欄で、スケジュールをcron形式で指定します。

cron式の指定方法については、ドキュメントを参照してください。
https://docs.aws.amazon.com/ja_jp/scheduler/latest/UserGuide/schedule-types.html#cron-based

本記事の執筆時点では上記ドキュメントは日本語訳が用意されていませんでしたので、同じ内容の「EventBridgeルール」のドキュメントを参照してもよいでしょう。
https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-create-rule-schedule.html#eb-cron-expressions

例えば、「月曜日~金曜日の毎朝7:30」と指定したい場合、cron式は以下のように入力します。

曜日
30 7 ? * MON-FRI *

「フレックスタイムウィンドウ」は、今回は「オフ」に設定しておきます。

「タイムゾーン」が「Asia/Tokyo」になっていることを確認します。
「開始時刻」と「終了時刻」は、必要に応じて入力してください。(省略可能)

次のステップでは、「ターゲット」となるAWSサービス・APIを指定していきます。

「すべてのAPI」を選択して、検索ボックスに「amazon connect」と入力します。
サービスが絞り込まれて「Amazon Connect」が表示されるので、クリックして選択します。

続いて、Amazon ConnectのAPIを選択します。

検索ボックスに「start」と入力します。
APIが絞り込まれて「StartOutboundVoiceContact」が表示されるので、クリックして選択します。

APIを選択すると、画面の下に「入力」項目が表示されます。

ここでは、APIに渡すパラメーターをJSON形式で入力します。

デフォルトで入力されているJSON文字列を一旦全て削除して、以下のJSON文字列を入力します。

{
  "InstanceId": "<Amazon ConnectインスタンスのID>",
  "ContactFlowId": "<コンタクトフローのID>",
  "DestinationPhoneNumber": "<発信先電話番号>",
  "SourcePhoneNumber": "<発信元電話番号>"
}

「Amazon ConnectインスタンスのID」と「コンタクトフローのID」は、Amazon Connectの設定を行った際に確認した「コンタクトフローARN」から抜き出して使います。

コンタクトフローARNのフォーマットは以下のようになっています。
arn:aws:connect:ap-northeast-1:123456789012:instance/<インスタンスのID>/contact-flow/<コンタクトフローのID>
ここから「インスタンスのID」と「コンタクトフローのID」の部分をコピーして、上記のJSONに貼り付けます。

「発信先電話番号」は、電話を掛けてもらいたい電話番号を「E.164」形式で指定します。
「発信元電話番号」は、Amazon Connectで取得した電話番号を、同じく「E.164」形式で指定します。

次のステップでは、その他の各種設定を行います。

「スケジュールを有効化」のスイッチが「有効」になっていることを確認します。

今回はテストですので、「再試行ポリシー」は「無効」に設定しておきます。
APIの呼び出しに失敗した場合に再試行を繰り返すことで想定外の料金が発生したりすることを避けるためです。

デッドレターキュー、暗号化の設定はデフォルトのままで構いません。

最後に、アクセス許可の設定を行います。

前の手順で作成した「IAMロール」を指定します。

「次へ」をクリックして、設定内容の確認を行い、スケジュールの作成を完了します。

これで全ての準備が終わりました!

動作確認

あとは、スケジュールで指定した日時になれば、Mizukiさんからモーニングコールが掛かってくるはずです。(ワクワク・・・)

掛かってきました!

これでもう、大事な会議がある日に寝坊することもなくなるでしょう。

上手くいかない時は

ここまで設定を進めたけれども、上手くいかない (時間になっても電話が掛かってこない) 場合は、設定内容や環境を見直してみましょう。

  • アクセス権限の設定を確認する
    • IAMポリシーの設定が正しいかどうか確認しましょう。
  • cron式の設定を確認する
    • 意図した日時の指定になっているか確認しましょう。
    • cron式の設定方法がよく分からない時は、まずは「1回限りのスケジュール」や「rateベースのスケジュール」で設定してみて、動作するかどうか切り分けてみましょう。
  • APIの入力パラメーターを確認する
    • 「インスタンスID」「コンタクトフローID」が正しいことを確認しましょう。
    • 「発信先電話番号」「発信元電話番号」の指定が正しい「E.164形式」で記述していることを確認しましょう。(先頭に国番号(+81等)を付ける、市外局番の最初の「0」は省略する、ハイフンは付けない、・・・など)
  • 携帯電話への発信が許可されていることを確認する
    • Amazon Connectのデフォルトでは、携帯電話 (090/080/070) への発信が制限されています。
    • 制限解除の申請をまだ行っていないのであれば、下記のブログ記事を参考にして申請手続きを行ってください。
    • 携帯電話への発信が行えない場合、固定電話やIP電話 (050) を指定してテストしてみましょう。

おわりに

従来はコードを書かなければ実現が難しかった「自動電話発信」ですが、EventBridge Schedulerを使うと「ノーコード」で実現できることが分かりました。

とは言え、今回試した内容だと、発信先電話番号や使用するフローなどがJSON文字列に埋め込みで指定しなければならない点や、エラー処理なども全く考慮していない点などにおいて、本番システム・プロダクションで利用するには十分ではないというのも事実です。

今後は、このあたりをもっと検討してみたいと思います。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.